#!/bin/bash

# 部署脚本 - 命格大师API

set -e

# 显示帮助信息
show_help() {
    echo "命格大师API部署脚本"
    echo "用法: ./deploy.sh [选项]"
    echo "选项:"
    echo "  --build       构建并启动所有服务"
    echo "  --start       启动所有服务"
    echo "  --stop        停止所有服务"
    echo "  --restart     重启所有服务"
    echo "  --logs        查看服务日志"
    echo "  --status      查看服务状态"
    echo "  --migrate     执行数据库迁移"
    echo "  --backup      备份数据库"
    echo "  --build-frontend 仅构建前端项目"
    echo "  --help        显示此帮助信息"
}

# 检查Docker和Docker Compose是否安装
check_docker() {
    if ! command -v docker &> /dev/null; then
        echo "错误: Docker未安装，请先安装Docker。"
        exit 1
    fi
    
    if ! docker compose version &> /dev/null; then
        echo "错误: Docker Compose未安装，请先安装Docker Compose。"
        exit 1
    fi
}

# 检查Node.js是否安装
check_nodejs() {
    if ! command -v node &> /dev/null; then
        echo "错误: Node.js未安装，请先安装Node.js。"
        exit 1
    fi
    
    if ! command -v npm &> /dev/null; then
        echo "错误: npm未安装，请先安装npm。"
        exit 1
    fi
}

# 创建必要的目录
create_directories() {
    echo "创建必要的目录..."
    mkdir -p docker/volumes/app/storage
    mkdir -p docker/volumes/app/logs
    mkdir -p docker/volumes/db/data
    mkdir -p docker/volumes/redis/data
    mkdir -p docker/volumes/nginx/logs
}

# 检查.env文件
check_env_file() {
    if [ ! -f .env ]; then
        echo "警告: .env文件不存在，正在从.env_bak创建..."
        if [ -f .env_bak ]; then
            cp .env_bak .env
            echo "已创建.env文件，请检查并更新配置。"
        else
            echo "错误: .env_bak文件不存在，无法创建.env文件。"
            exit 1
        fi
    fi
}

# 检查SSL证书
check_ssl_certificates() {
    if [ ! -f docker/nginx/ssl/mingyun.online.pem ] || [ ! -f docker/nginx/ssl/mingyun.online.key ]; then
        echo "警告: SSL证书文件不存在，请确保在部署前放置SSL证书到docker/nginx/ssl/目录。"
    fi
}

# 构建前端项目
build_frontend() {
    echo "构建前端项目..."
    cd measurement_client
    
    # 安装依赖并构建
    npm install
    npm run build
    
    cd ..
    echo "前端项目构建完成。"
}

# 构建并启动服务
build_and_start() {
    echo "构建并启动服务..."
    
    # 构建前端项目
    build_frontend
    
    # 启动Docker服务
    docker compose up -d --build
    echo "服务已启动，可以使用 './deploy.sh --status' 查看状态。"
}

# 启动服务
start_services() {
    echo "启动服务..."
    docker compose up -d
    echo "服务已启动，可以使用 './deploy.sh --status' 查看状态。"
}

# 停止服务
stop_services() {
    echo "停止服务..."
    docker compose down
    echo "服务已停止。"
}

# 重启服务
restart_services() {
    echo "重启服务..."
    docker compose restart
    echo "服务已重启，可以使用 './deploy.sh --status' 查看状态。"
}

# 查看日志
view_logs() {
    echo "查看服务日志..."
    docker compose logs --tail=100 -f
}

# 查看状态
view_status() {
    echo "查看服务状态..."
    docker compose ps
}

# 执行数据库迁移
run_migration() {
    echo "执行数据库迁移..."
    docker compose exec measurement bash -c "alembic upgrade head"
    echo "迁移完成。"
}

# 备份数据库
backup_database() {
    local backup_file="backup_$(date +%Y%m%d_%H%M%S).sql"
    echo "备份数据库到 $backup_file ..."
    docker compose exec db pg_dump -U postgres measurement_db > $backup_file
    echo "备份完成：$backup_file"
}

# 主函数
main() {
    check_docker
    
    if [ $# -eq 0 ]; then
        show_help
        exit 0
    fi
    
    case "$1" in
        --build)
            check_env_file
            check_ssl_certificates
            create_directories
            build_and_start
            ;;
        --start)
            check_env_file
            start_services
            ;;
        --stop)
            stop_services
            ;;
        --restart)
            restart_services
            ;;
        --logs)
            view_logs
            ;;
        --status)
            view_status
            ;;
        --migrate)
            run_migration
            ;;
        --backup)
            backup_database
            ;;
        --build-frontend)
            check_nodejs
            build_frontend
            ;;
        --help)
            show_help
            ;;
        *)
            echo "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@" 